package algoritmi;

import gui.*;

import java.io.*;
import java.util.*;
/**
 * 
 * @author Miroslav Bogdanovic
 *
 */
public class Ucitavanje
{
	
	private static final double EPS = 1e-9;
	
	private ArrayList<Integer> brojevi;
	
	private int duzina;
	private int memorija;
	private double lokalnost;
	private NacinUnosa nacinUnosa;
	
	public Ucitavanje()
	{
		brojevi = new ArrayList<Integer>();
	}
	
	public Ucitavanje(int duzina, int memorija, double lokalnost,
			NacinUnosa nacinUnosa) {
		brojevi = new ArrayList<Integer>();
		this.duzina = duzina;
		this.memorija = memorija;
		this.lokalnost = lokalnost;
		this.nacinUnosa = nacinUnosa;
	}
	
	public int[] ucitaj() {
		brojevi = new ArrayList<Integer>();
		
		
		if(this.nacinUnosa == NacinUnosa.FAJL)
			this.ucitajIzFajla("zahtevi.txt");
		
		if(this.nacinUnosa == NacinUnosa.RANDOM)
			this.generisiBrojeve(lokalnost, memorija, duzina);
				
		if(this.nacinUnosa == NacinUnosa.RUCNI)
			this.brojevi = RucniUnosPanel.getSadrzajMemorije();
		
		int niz[] = new int[brojevi.size()];
		for(int i = 0; i < brojevi.size(); i++)
			niz[i] = brojevi.get(i);
		
		return niz;
		
		
	}

	void ucitajIzFajla(String imeFajla)
	{
		try
		{
			Scanner citac = new Scanner(new FileReader(imeFajla));
			while(citac.hasNextInt())
				brojevi.add(citac.nextInt());
		} 
		catch (FileNotFoundException e)
		{
			System.out.println("Trazeni fajl ne postoji.");
		}
	}
	
	private double funkcijaNormalneRaspodele(double x, double mi, double sigmaKvadrat)
	{
		return Math.exp(-(x - mi) * (x - mi) / (2 * sigmaKvadrat)) / Math.sqrt(2 * Math.PI * sigmaKvadrat);
	}
	
	// lokalnost je u stvari sigma^2 u normalnoj raspodeli
	// 1 daje jaku lokalnost
	// 5-10 daje osrednju
	// ~100 nema lokalnosti
	void generisiBrojeve(double lokalnost, int velicinaGlavneMemorije, int duzinaNiza)
	{
		double sigmaKvadrat = (11 - lokalnost) * (11 - lokalnost);
		java.util.Random random = new java.util.Random();
		brojevi.add(random.nextInt(velicinaGlavneMemorije));
		for(int i = 1; i < duzinaNiza; i++)
		{
			double[] verovatnoca = new double[velicinaGlavneMemorije];
			double suma = 0;
			for(int j = 0; j < velicinaGlavneMemorije; j++)
			{
				verovatnoca[j] = funkcijaNormalneRaspodele(j, brojevi.get(i - 1), sigmaKvadrat);
				suma += verovatnoca[j];
			}
			//System.out.println(suma);
			//System.out.println(verovatnoca[0]);
			double sledeci = random.nextDouble() * suma;
			int k = -1;
			double trenutnaSuma = 0;
			do
			{
				k++;
				trenutnaSuma += verovatnoca[k];
				//System.out.println(trenutnaSuma + " " + sledeci);
			} while(trenutnaSuma < sledeci - EPS);
			brojevi.add(k);
		}
		
	}
	
	/*void noviNiz()
	{
		brojevi.clear();
	}
	
	void dodajBroj(int broj)
	{
		brojevi.add(broj);
	}
	
	void postaviNiz(int[] niz)
	{
		brojevi.clear();
		for (int broj : niz)
		{
			brojevi.add(broj);
		}
	}
	
	ArrayList<Integer> uzmiNiz()
	{
		return brojevi;
	}*/
	
	public static void main(String[] args)
	{
		Ucitavanje ucitavanje = new Ucitavanje();
		ucitavanje.generisiBrojeve(5, 10, 20);
		ArrayList<Integer> brojevi = ucitavanje.brojevi;
		System.out.println(brojevi);
	}
	
}
